import Koa from 'koa'
const consola = require('consola')
const {
  Nuxt,
  Builder
} = require('nuxt')

//引入数据库
import mongoose from 'mongoose'
// bodyParser 处理和post相关的请求，没有这个包就拿不到服务端对应的post请求的参数
import bodyParser from 'koa-bodyparser'
//session 关于登录注册都是用了session和cookise 
//虽然代码中没有一行关于cookies的操作 就是这个koa-generic-session帮我们去操作了session
import session from 'koa-generic-session'
//引入redis
import Redis from 'koa-redis'
//引入json 是为了美化  解决服务端向客户端发送json格式美化的
import json from 'koa-json'
//引入 dbs配置
import dbConfig from './dbs/config'
//引入passport 
import passport from './interface/utils/passport'
//引入users的接口
import users from './interface/users'
import geo from './interface/geo'
import search from './interface/search'

//不要忘记安装这些包

const app = new Koa()
const host = process.env.HOST || '127.0.0.1'
const port = process.env.PORT || 3000

//配置引入的
//关于session的秘钥匙
app.keys = ['mt', 'keyskeys']
app.proxy = true
//给session加上前缀 cookies将来存储在session 加上前缀好识别
//以及将session存储在redis中 配置store

//这里是关于session一些配置 没有配置cookies属性 拥有默认过期时间等配置
app.use(session({
  key: 'mt',
  prefix: 'mt:uid',
  //将session保存在redis中
  store: new Redis()
}))
//关于bodyparser配置 关于post请求的配置
app.use(bodyParser({
  //扩展类型处理 
  extendType: ['json', 'form', 'text']
}))
app.use(json())

//连接数据库
//moogoose  的api方法 链接 connect()
mongoose.connect(dbConfig.dbs, {
  //这里的配置是固定的
  useNewUrlParser: true
})
//初始化passport 处理登录相关的
app.use(passport.initialize())
//这个session 是使用passport序列化必须的配置
//序列化的时候 passport.session() 是配置 固定  意思为为session添加一个passport属性 
//这个passport属性登陆成功(调用ctx.login()时)序列化的时候 已经自动为我做了保存用户信息在session中(下发到客户端的cookies中) 可以通过sessionid(也就是客户端的cookise)拿到
app.use(passport.session())
//使用

// Import and Set Nuxt.js options
let config = require('../nuxt.config.js')
config.dev = !(app.env === 'production')

async function start() {
  // Instantiate nuxt.js
  const nuxt = new Nuxt(config)

  // Build in development
  if (config.dev) {
    const builder = new Builder(nuxt)
    await builder.build()
  }
  //配制接口 一定要在app.ues接口之前
  app.use(users.routes()).use(users.allowedMethods())
  app.use(geo.routes()).use(geo.allowedMethods())
  app.use(search.routes()).use(search.allowedMethods())
  app.use(ctx => {
    ctx.status = 200 // koa defaults to 404 when it sees that status is unset

    return new Promise((resolve, reject) => {
      ctx.res.on('close', resolve)
      ctx.res.on('finish', resolve)
      nuxt.render(ctx.req, ctx.res, promise => {
        // nuxt.render passes a rejected promise into callback on error.
        promise.then(resolve).catch(reject)
      })
    })
  })

  app.listen(port, host)
  consola.ready({
    message: `Server listening on http://${host}:${port}`,
    badge: true
  })
}

start()
